package com.atguigu.principle.singleresponsibility.singleton.type5;

/**
 * @Author: yangtao
 * @Description:
 * 静态内部类
 * 这种方式采用了类加载的机制类保证初始化实例只有一个线程
 * 静态内部类方式在Singleton类被装载的并不会立即实例化 是在需要完成实例化时候
 * 调用getInstance方法 才会装载SingletonInstance类 完成Singleton的实例化
 * 类的静态属性只会在第一次加载类的时候初始化 所以在这里 jvm帮助我们保证了线程的安全性
 * 在类进行初始化 别的线程是无法进入的
 * 优点 避免了线程不安全 利用静态内部类特对岸实现延迟加载 效率高
 */
public class Singleton6 {

    public static void main(String[] args) {
        System.out.println("使用静态内部类完成单例模式");
      Singleton instance = Singleton.getInstance();
       Singleton instance2 = Singleton.getInstance();
        System.out.println(instance == instance2);
    }
}

//静态内部类完成
class Singleton{
   private static volatile Singleton instance;

   //构造器私有化
   private Singleton(){ }

   //静态内部类,该类中有一个静态属性,直接返回一个成员变量
    private  static class SingletonInstance{
       private static final Singleton INSTANCE = new Singleton();
   }

   //提供一个静态公有方法 使用到方法 采取创建，同步代码块
    //同时解决懒加载的问题 也保证了效率
    public static synchronized Singleton getInstance(){

       return SingletonInstance.INSTANCE;
    }

}
